perm filename DIFF.LSP[206,LSP] blob sn#383553 filedate 1978-09-21 generic text, type T, neo UTF8
;;;functions that manipulate arithmetic expressions

(DEFPROP DIFF (
	DIFF
        NUMVAL
	EVPLUS
	EVTIMES
	SIMP 
	SIMP1 
	SPLUS 
	STIMES 
	SOP
	PLUSSOP
	MONOMIAL
	TIMESOP
	DISTRIB
	MONPROD
	MAPAPP
) DIFFFNS)
;;;DIFF symbolically differentiates arithmetic expressions

(DEFUN DIFF (E V) 
  (COND	((ATOM E) (COND ((EQ E V) 1) (T 0)))
	((EQ (CAR E) 'PLUS)
	 (CONS 'PLUS
	       (MAPCAR (FUNCTION (LAMBDA (X) (DIFF X V))) (CDR E))))
	((EQ (CAR E) 'TIMES)
	 (CONS 'PLUS
	       (MAPLIST (FUNCTION 
			  (LAMBDA (X) 
			    (CONS 'TIMES
				  (MAPLIST (FUNCTION 
					    (LAMBDA (Y) 
					      (COND ((EQ X Y) (DIFF (CAR Y) V))
						    (T (CAR Y)))))
					   (CDR E)))))
	                (CDR E))))))
;;;arithmetic expression evaluator

(DEFUN NUMVAL (E A)
  (COND ((NUMBERP E) E)
	((ATOM E) (CDR (ASSOC E A))
	((EQ (CAR E) 'PLUS) (EVPLUS (CDR E) A))
	((EQ (CAR E) 'TIMES) (EVTIMES (CDR E) A)) ))

(DEFUN EVPLUS (U A)
  (COND ((NULL U) 0) (T (PLUS (NUMVAL (CAR U) A) (EVPLUS (CDR U) A))) ))

(DEFUN EVTIMES (U A)
  (COND ((NULL U) 1) (T (TIMES (NUMVAL (CAR U) A) (EVTIMES (CDR U) A))) ))
;;;SIMP simplifies arith expressions

(DEFUN SIMP (U)
  (COND ((ATOM U) U)
	(T ((LAMBDA (W) (COND ((EQUAL W U) U) (T (SIMP W))))
	    (SIMP1 (CONS (CAR U) 
		         (MAPLIST (FUNCTION (LAMBDA (Z) (SIMP (CAR Z)))) 
				  (CDR U)))))))) 

(DEFUN SIMP1 (E)
  (COND ((EQ (CAR E) (QUOTE MINUS))
         (COND ((AND (NOT (ATOM (CADR E))) (EQ (CAADR E) (QUOTE MINUS))) (CADADR E))
               (T E)))
	((EQ (CAR E) (QUOTE PLUS))
         ((LAMBDA (W) 
            (COND ((NULL W) 0) ((NULL (CDR W)) (CAR W)) (T (CONS (QUOTE PLUS) W)))) 
          (SPLUS (CDR E))))
        ((EQ (CAR E) (QUOTE TIMES))
         ((LAMBDA (W) 
	    (COND ((NULL W) 1) 
		  ((EQ W (QUOTE NO)) 0) 
		  ((NULL (CDR W)) (CAR W)) 
		  (T (CONS (QUOTE TIMES) W))))
          (STIMES (CDR E)))))) 

(DEFUN SPLUS (U) 
  (COND ((NULL U) NIL) 
	((EQ (CAR U) 0) (SPLUS (CDR U))) 
	(T (CONS (CAR U) (SPLUS (CDR U)))))) 

(DEFUN STIMES (U)
  (COND ((NULL U) NIL)
	(T ((LAMBDA (W)
	      (COND ((EQ W (QUOTE NO)) W) 
		    ((EQ (CAR U) 0) (QUOTE NO)) 
		    ((EQ (CAR U) 1) W) 
		    (T (CONS (CAR U) W))))
	    (STIMES (CDR U)))))) 
;;;SOP returns sum of products normal form for arith expressions


(DEFUN SOP (E) 
       (COND ((ATOM E) E)
	     ((EQ (CAR E) 'PLUS)
	      (CONS 'PLUS
		    (PLUSSOP (MAPCAR (FUNCTION SOP) (CDR E)))))
	     ((EQ (CAR E) 'TIMES)
	      (TIMESOP (MAPCAR (FUNCTION SOP) (CDR E))))))

(DEFUN PLUSSOP (U) 
       (COND ((NULL U) NIL)
	     ((MONOMIAL (CAR U)) (CONS (CAR U) (PLUSSOP (CDR U))))
	     (T (APPEND (CDAR U) (PLUSSOP (CDR U))))))

(DEFUN MONOMIAL (E) (OR (ATOM E) (EQ (CAR E) 'TIMES)))

(DEFUN TIMESOP (U) 
       (COND ((NULL (CDR U)) (CAR U))
	     (T (DISTRIB (CAR U) (TIMESOP (CDR U))))))

(DEFUN DISTRIB (S1 S2) 
       (COND
	((MONOMIAL S2)
	 (COND ((MONOMIAL S1) (MONPROD S1 S2))
	       (T (CONS 'PLUS
			(MAPCAR (FUNCTION (LAMBDA (X) (MONPROD X S2)))
				(CDR S1))))))
	((MONOMIAL S1)
	 (CONS 'PLUS
	       (MAPCAR (FUNCTION (LAMBDA (Y) (MONPROD S1 Y))) (CDR S2))))
	(T
	 (CONS
	  'PLUS
	  (MAPAPP 
	   (FUNCTION (LAMBDA (X) (MAPCAR (FUNCTION (LAMBDA (Y) 
							   (MONPROD X Y)))
					 (CDR S2))))
	   (CDR S1))))))

(DEFUN MONPROD (M1 M2) 
       (CONS 'TIMES
	     (COND ((ATOM M1)
		    (COND ((ATOM M2) (LIST M1 M2))
			  (T (CONS M1 (CDR M2)))))
		   (T (APPEND (CDR M1)
			      (COND ((ATOM M2) (NCONS M2))
				    (T (CDR M2)))))))) 
(DEFUN MAPAPP (FN U)
  (COND ((NULL U) NIL)
	(T (APPEND (APPLY FN (LIST(CAR U))) (MAPAPP FN (CDR U)))) ))